let rec A (exp:string) (index:int) = 
// 传入两个参数 取到这个下标的字符串
// 先匹配a 如果是a 我递归的再去找a ，去下个字符找 往后稍稍
// 不然的话 这个下标的 字符是不是b啊 我试试吧 
// 由此好像看出了 F# 语法的好处 ，可以返回一个int 作为下标 不然的话 也可以递归
// 在处理这个问题上 确实挺优雅的
    match exp.[index] with
    | 'a' -> A exp (index+1) 
    |  _  -> index

let rec B (exp:string) (idx:int) = 
    match exp.[idx] with
    | 'b' -> B exp (idx+1) 
    |  _  -> idx
    
let rec D (exp:string) (idx:int) = 
    match exp.[idx] with
    | 'd' -> D exp (idx+1) 
    |  _  -> idx

let S exp:string=
   let idx = D  exp (B exp (A exp 0 ) )
   if exp.[idx] ='#' then  "匹配成功"
   else  "匹配失败";;

// let Exp (exp:string) (idx:int) =


let Stm exp:string=
    match exp.[idx] with
    | 'i' -> 
        idx++
        idx++
        Exp exp idx
    |  'p'  ->
        idx++
        idx++

    |  _  -> idx
   let idx = D  exp (B exp (A exp 0 ) )
   if exp.[idx] ='#' then  "匹配成功"
   else  "匹配失败";;

S "#";;
S "abd#";;
S "a#";;
S "ab#";;
S "bd#";;
S "aabd#";;
S "aabbd#";;
S "aabbdd#";;
S "bbdda#";;
S "bda#";;
S "adbc#";;
S "adbc#";;

